home *** CD-ROM | disk | FTP | other *** search
- #include "LocateFile.h"
-
- #define Bump(action) if (e = action) return e
-
- OSErr LocateFile (OSType where, OSType fdType, OSType fdCreator, short strFileName, FSSpec *spec, Boolean create, Boolean *wasAbsent, Boolean copyVers)
- {
- short index;
- CInfoPBRec fpb;
- Boolean finished;
- OSErr e;
- StringHandle name;
- Str255 emptyName;
- Handle version;
- short refNum;
-
- Bump(FindFolder(kOnSystemDisk, where, kCreateFolder, &spec->vRefNum, &spec->parID));
-
- fpb.hFileInfo.ioNamePtr = spec->name;
- index = 1;
- finished = false;
- do { // Loop over all files in the folder
- fpb.hFileInfo.ioVRefNum = spec->vRefNum;
- fpb.hFileInfo.ioDirID = spec->parID;
- fpb.hFileInfo.ioFDirIndex = index;
-
- if ((e = PBGetCatInfoSync(&fpb)) == noErr)
- if (fpb.hFileInfo.ioFlFndrInfo.fdType == fdType && fpb.hFileInfo.ioFlFndrInfo.fdCreator == fdCreator) {
- if (wasAbsent)
- *wasAbsent = false; // If the type and creator match, we have
- return noErr; // found the right file, exit
- }
-
- index++;
- } while (e == noErr);
-
- if (wasAbsent)
- *wasAbsent = true; // The file wasn't found
-
- if (create) { // Create it if we were asked to do so
- name = GetString(strFileName);
- if (!name)
- return memFullErr;
- BlockMove(*name, spec->name, (*name)[0]+1); // Just a Pascal string copy...
- ReleaseResource((Handle) name);
- FSpCreateResFile(spec, fdCreator, fdType, 0); // Create the file
- Bump(ResError());
-
- if (copyVers) {
- version = GetResource('vers', 2); // Get our own version resource
- if (version == NULL)
- return resNotFound;
- DetachResource(version);
- refNum = FSpOpenResFile(spec, fsRdWrPerm); // Open the file
- Bump(ResError());
- emptyName[0] = 0;
- AddResource(version, 'vers', 2, emptyName); // Write the version resource into it
- Bump(ResError());
- WriteResource(version);
- Bump(ResError());
- CloseResFile(refNum); // Close it
- }
- return noErr;
- }
- else
- return fnfErr;
- }
-